package com.gitee.feizns.explore.data_structure.linked_list.singly.ring;

import java.util.HashSet;
import java.util.Set;

/**
 *
 * 给定一个链表，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。
 *
 * 为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。
 *
 * 说明：不允许修改给定的链表。
 *
 * @author feizns
 * @since 2019/9/29
 */
public class Ring2 {

    public static void main(String[] args) {
        ListNode node = ListNode.create();
        System.out.println(quickAndSlowDetectCycle(node).val);
    }

    public static ListNode detectCycle(ListNode head) {
        Set<ListNode> processed = new HashSet<>();
        ListNode tmp = head;
        while ( tmp != null ) {
            if ( processed.contains(tmp) )
                return tmp;
            processed.add(tmp);
            tmp = tmp.next;
        }
        return null;
    }

    public static ListNode quickAndSlowDetectCycle(ListNode head) {
        ListNode step1 = head;
        ListNode step2 = head;

        while ( true ) {
            step2 = step2.next;
            if ( step2 == null )
                return null;

            step2 = step2.next;
            if ( step2 == null )
                return null;

            step1 = step1.next;
            if ( step1 == step2 )
                return step2;
        }
    }

    public static ListNode quickAndSlowDetectCycle2(ListNode head) {
        ListNode node = quickAndSlowDetectCycle(head);
//        if ( node.next == node )

        return null;
    }

}
